package doc2db.interfaces.action.save;

import doc2db.interfaces.mainWindow.MyJEditorPane;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;

/**
 *
 * @author yura
 */
public class SaveXls implements Saver{
    /** Edit panel whith date */
    private MyJEditorPane medit ;

    /** Text of error if it hapen */
    private String error = "ancnown";

    /**
     * this.medit = medit;
     * @param medit edit panel whith date
     */
    public SaveXls(MyJEditorPane medit) {
        this.medit = medit;
    }

    @Override
    public String err(){
        return error;
    }

    /**
     *  Edit panel whith date
     * @return Edit panel whith date
     */
    public MyJEditorPane getMedit() {
        return medit;
    }

    /**
     *  Edit panel whith date
     * @param medit Edit panel whith date
     */
    public void setMedit(MyJEditorPane medit) {
        this.medit = medit;
    }


    @Override
    public boolean save (String fname){
        return saveXls(fname);
    }

    /**
     * Save data grom MyJEditorPane into xls-file
     * @param fname name of file to save
     * @return trut if it saved and false in another way,
     * error message can get to call method getError();
     */
    public boolean saveXls (String fname){
        String mfname;
        if (new File(fname).exists()){
            mfname = "" + fname;
        } else if (fname.endsWith(".xls") | fname.endsWith(".XLS")) {
            mfname = "" + fname;
        } else {
            mfname = fname + ".xls";
        }

        //Получаем данные из таблицы
        String[][] excelData = medit.table;
        //Заголовок таблицы
        String [] head = medit.head;
        //Создаем объекты библиотеки для работы с xls таблицами
        HSSFWorkbook myWorkBook = new HSSFWorkbook();
        HSSFSheet mySheet = myWorkBook.createSheet();
        HSSFRow myRow = null;
        HSSFCell myCell = null;
        int hight = 0;
        int inc = 0;
        ArrayList a = this.CreateStyle(myWorkBook);

        if (head != null){
            myRow = mySheet.createRow(0);
            inc = 1;
            hight = 16;

            for (int cellNum = 0; cellNum < head.length; cellNum++) {
                myCell = myRow.createCell(cellNum);//(short)cellNum);
                myCell.setCellValue(head[cellNum]);
                HSSFCellStyle style = (HSSFCellStyle) a.get(0);
                myCell.setCellStyle(style);
            }
        }

        //Заполняем ячейки таблицы данными и опредяем необходимое оформление
        for (int rowNum = 0; rowNum < excelData.length; rowNum++) {

            myRow = mySheet.createRow(rowNum + inc);
            hight = 16;//table.getRowHeight(rowNum - 1);

            for (int cellNum = 0; cellNum < excelData[0].length; cellNum++) {

                myCell = myRow.createCell(cellNum);//(short)cellNum);
                if (hight != 16) {
                    HSSFCellStyle style = (HSSFCellStyle) a.get(2);
                    myCell.setCellStyle(style);
                    hight = 0;
                }
                if (rowNum == 0 && head == null) {
                    myCell.setCellValue(excelData[rowNum][cellNum]);
                    HSSFCellStyle style = (HSSFCellStyle) a.get(0);
                    myCell.setCellStyle(style);
                } else {
                    myCell.setCellValue(excelData[rowNum][cellNum]);
                    HSSFCellStyle style = (HSSFCellStyle) a.get(1);
                    myCell.setCellStyle(style);
                    if (hight != 16) {
                        style = (HSSFCellStyle) a.get(3);
                        myCell.setCellStyle(style);
                        hight = 0;
                        continue;
                    }
                }
            }

        }

        int maxtext = 0;
        
        //Определяем максимальную длину текста ячеки в столбце таблицы
        // и задаем размер для всего столбца в документе
        if (excelData.length > 0) {
            for (int j = 0; j < excelData[0].length; j++) {
                for (int i = 0; i < excelData.length; i++) {

                    String s = excelData[i][j];
                    int len = s.length();
                    if (maxtext < len) {
                        maxtext = len;
                        int width = 200 + 256 * maxtext;
                        mySheet.setColumnWidth(j, width);//(short)j, (short)(width));
                    }
                }
                maxtext = 0;
            }
        }
        //Записываем в файл
        try {
            FileOutputStream out = new FileOutputStream(mfname);
            myWorkBook.write(out);
            out.close();
        } catch (Exception e) {
            error = "" + e;
            return false;
        }
        return true;
    }

    /**
     * Метод записывает созданные стили ячеек в спичоный массив
     * @param myWorkBook Рабочая книга типа HSSFWorkbook
     * @return Возвращает ArrayList<HSSFCellStyle>  котором содержаться созданые стили
     */
    public ArrayList<HSSFCellStyle> CreateStyle(HSSFWorkbook myWorkBook) {
        ArrayList arr = new ArrayList<HSSFCellStyle>();

        // Стиль для заголовков - выравнивание текста по середине,
        //рамки ячеек - полужирные, чёрные
        HSSFCellStyle style = myWorkBook.createCellStyle();
        style.setAlignment(CellStyle.ALIGN_CENTER);
        style.setBorderRight(CellStyle.BORDER_MEDIUM);
        style.setBorderBottom(CellStyle.BORDER_MEDIUM);
        style.setBorderLeft(CellStyle.BORDER_MEDIUM);
        style.setBorderTop(CellStyle.BORDER_MEDIUM);
        arr.add(style);

        //Стиль для обычных ячеек таблицы - выравнивание по левому краю(стандартное),
        //рамки - тонкие, чёрные
        HSSFCellStyle style1 = myWorkBook.createCellStyle();
        style1.setBorderRight(CellStyle.BORDER_THIN);
        style1.setBorderBottom(CellStyle.BORDER_THIN);
        style1.setBorderLeft(CellStyle.BORDER_THIN);
        style1.setBorderTop(CellStyle.BORDER_THIN);
        arr.add(style1);

        //Стиль для заголовка, если он содержит более одной строки в таблице,
        // оформление такое же, но с использованием многострочного текста
        HSSFCellStyle style2 = myWorkBook.createCellStyle();
        style2.setBorderRight(CellStyle.BORDER_MEDIUM);
        style2.setBorderBottom(CellStyle.BORDER_MEDIUM);
        style2.setBorderLeft(CellStyle.BORDER_MEDIUM);
        style2.setBorderTop(CellStyle.BORDER_MEDIUM);
        style2.setWrapText(true);
        arr.add(style2);

        //Стиль для ячеек, если они содержат более одной строки в таблице,
        // оформление такое же, но с использованием многострочного текста
        HSSFCellStyle style3 = myWorkBook.createCellStyle();
        style3.setBorderRight(CellStyle.BORDER_THIN);
        style3.setBorderBottom(CellStyle.BORDER_THIN);
        style3.setBorderLeft(CellStyle.BORDER_THIN);
        style3.setBorderTop(CellStyle.BORDER_THIN);
        style3.setWrapText(true);
        arr.add(style3);
        return arr;

    }
}
